// Rust变量和可变性

pub fn variable_demo() {
    println!("========== 变量和可变性 ==========");

    // 变量默认是不可变的，也就是变量一旦被赋值就不可以再被赋值
    let x = 6;
    println!("the value of x is: {}", x);


    // 使用 mut 声明变量为可变的，变量可以被再次赋值
    let mut y = 3;
    println!("the value of y is: {}", y);
    y = 3*4;
    println!("the value of second y is: {}", y);


    // 变量遮蔽，使用 let 声明和前面变量具有相同名称的新变量。第一个变量被第二个变量遮蔽（shadow）
    // 遮蔽和将变量标记为 mut 的方式不同，因为除非我们再次使用 let 关键字
    // mut 和遮蔽之间的另一个区别是，因为我们在再次使用 let 关键字时有效地创建了一个新的变量，
    // 所以我们可以改变值的类型，但重复使用相同的名称。
    let a = 4;
    let a = a + 6;

    // 第一个变量 spaces 的类型为 &str 而在变量遮蔽后 spaces 的类型变为 usize
    // 但一个可变变量一旦被赋值，其类型就被确定了，通过再次赋值不能改变原始变量的类型
    let spaces = "hello world";
    let spaces = spaces.len();
    println!("the value of spaces is: {}", spaces);
    {
        let a = a * 2;
        println!("the value of a in the inner scope is: {}", a);
    }
    println!("the value of a is: {}", a);


    // 常量，常量不允许使用 mut。常量不仅仅默认不可变，而且自始至终不可变。
    // 常量使用 const 关键字而不是 let 关键字来声明，并且值的类型必须注明
    // 常量的命名约定是全部字母都使用大写，并使用下划线分隔单词
    const VARIABLE_DEMO: u32 = 2*5+7;


}